package com.refid.api.cmd;

import java.util.HashSet;
import java.util.List;

import com.refid.api.util.BuleUtil;

public abstract class Cmd {

	/**
	 * 得到发送的命令byte位数组。
	 * 
	 * @param hexs 十六进制字符串
	 * @return
	 */
	public byte[] toSendByte(String hexs) {
		hexs = repairCmd(hexs);
		String hex = null;
		String[] args = hexs.split(" ");
		byte[] rst = new byte[args.length];
		for (int i = 0; i < args.length; i++) {
			hex = args[i];
			hex = BuleUtil.trimTONull(hex);
			if (hex == null)
				continue;
			rst[i] = hexToByte(hex);
		}
		return rst;
	}

	/**
	 * 得到标签集
	 * 
	 * @param list
	 * @return
	 */
	protected abstract HashSet<String> cmdTOEcp(List<String> list);

	/**
	 * 通过接收到的十六进制数据分析得到标签集
	 * 
	 * @param hexs 返回的十六进制字符串
	 * @return
	 */
	public HashSet<String> cmdTOEcp(String hexs) {
		List<String> cmds = cmds(hexs);
		return cmdTOEcp(cmds);
	}

	/**
	 * 通过接收到的十六进制数据分析得到命令列表
	 * 
	 * @param hex
	 * @return
	 */
	public abstract List<String> cmds(String hexs);

	/**
	 * 发送命令补全操作
	 * 
	 * @param hexs 命令及参数
	 * @return
	 */
	protected abstract String repairCmd(String hexs);

	/**
	 * 转十六进制字符串
	 * 
	 * @param b 比特位
	 * @return 十六进制字符串
	 */
	public String byteToHex(byte b) {
		String hex = Integer.toHexString(b & 0xFF);
		if (hex.length() < 2) {
			hex = "0" + hex;
		}
		return hex.toUpperCase();
	}

	/**
	 * bytes 转十六进制字符串
	 * 
	 * @param bytes 比特位数组
	 * @return 十六进制字符串
	 */
	public String byteToHex(byte[] bytes) {
		if (bytes == null || bytes.length == 0)
			return "";
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < bytes.length; i++) {
			if (sb.length() > 0)
				sb.append(" ");
			sb.append(byteToHex(bytes[i]));
		}
		return sb.toString();
	}

	/**
	 * 十六进制转成byte
	 * 
	 * @param hex
	 * @return
	 */
	public byte hexToByte(String hex) {
		return (byte) hexToInt(hex);
	}

	/**
	 * 十六进制转成int
	 * 
	 * @param hex
	 * @return
	 */
	public int hexToInt(String hex) {
		return Integer.parseInt(hex, 16);
	}

	/**
	 * byte 转二进制字符串
	 * 
	 * @param b
	 * @return
	 */
	public String byteToBit(byte b) {
		return "" + (byte) ((b >> 7) & 0x1) + (byte) ((b >> 6) & 0x1) + (byte) ((b >> 5) & 0x1)
				+ (byte) ((b >> 4) & 0x1) + (byte) ((b >> 3) & 0x1) + (byte) ((b >> 2) & 0x1) + (byte) ((b >> 1) & 0x1)
				+ (byte) ((b >> 0) & 0x1);
	}

	/**
	 * 16进制字符串和校验
	 * 
	 * @param hexs
	 * @return
	 */
	public abstract String checkSum(String hexs);

}
